package edu.algo3.algoThief.dao;

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;

public class repositorioXML extends Repositorio {

	protected static Element racine;
	protected static org.jdom2.Document document = new Document(racine);
	
	// ********* Constructores **********
	
	protected repositorioXML()
	{
		
	}
	
	// ********* Getters **********
	
	protected static ArrayList<String> getDatosPais(String pais)
	{
		return DatosPaises.getDatosSobrePais(pais);
	}
	
	protected static ArrayList<String> getDatosSospechoso(String sospechosoApellido)
	{
		return DatosSospechosos.getDatosSobre(sospechosoApellido);
	}
	
	protected static int obtieneJugadorArrestos(String jugadorNombre)
	{
		return Archivo.getJugadorArrestos(jugadorNombre);
	}
	
	protected static String obtieneJugadorPistaActual(String jugadorNombre)
	{
		return Archivo.getJugadorPistaActual(jugadorNombre);
	}
	
	protected static int obtieneJugadorNumeroDeEdificiosVisitados(String jugadorNombre)
	{
		return Archivo.getJugadorNumeroDeEdificiosVisitados(jugadorNombre);
	}
	
	protected static Boolean obtieneJugadorYaHeridoConCuchillo(String jugadorNombre)
	{
		return Archivo.getJugadorYaHeridoConCuchillo(jugadorNombre);
	}
	
	protected static Boolean obtieneEstaEnCiudadIncorrecta(String jugadorNombre)
    {
        return Archivo.getEstaEnCiudadIncorrecta(jugadorNombre);
    }
	
	protected static String obtieneJugadorEdificioActual(String jugadorNombre)
	{
		return Archivo.getJugadorEdificioActual(jugadorNombre);
	}
	
	protected static String obtienePaisActual(String jugadorNombre)
	{
		return Archivo.getPaisActual(jugadorNombre);
	}
	
	protected static int obtieneTiempo(String jugadorNombre)
	{
		return Archivo.getTiempo(jugadorNombre);
	}
	
	protected static String obtieneOrdenDeArrestoApellido(String jugadorNombre)
	{
		return Archivo.getOrdenDeArrestoApellido(jugadorNombre);
	}
	
	protected static String obtieneOrdenDeArrestoSexo(String jugadorNombre)
	{
		return Archivo.getOrdenDeArrestoSexo(jugadorNombre);
	}
	
	protected static String obtieneOrdenDeArrestoSenia(String jugadorNombre)
	{
		return Archivo.getOrdenDeArrestoSenia(jugadorNombre);
	}
	
	protected static String obtieneOrdenDeArrestoCabello(String jugadorNombre)
	{
		return Archivo.getOrdenDeArrestoCabello(jugadorNombre);
	}
	
	protected static String obtieneOrdenDeArrestoVehiculo(String jugadorNombre)
	{
		return Archivo.getOrdenDeArrestoVehiculo(jugadorNombre);
	}
	
	protected static String obtieneOrdenDeArrestoHobby(String jugadorNombre)
	{
		return Archivo.getOrdenDeArrestoHobby(jugadorNombre);
	}
	
	protected static String obtieneLadronApellido(String jugadorNombre)
	{
		return Archivo.getLadronApellido(jugadorNombre);
	}
	
	protected static String obtieneObjetoRobadoNombre(String jugadorNombre)
	{
		return Archivo.getObjetoRobadoNombre(jugadorNombre);
	}
	
	protected static ArrayList<String> obtienePaisesDeEscape(String jugadorNombre)
	{
		return Archivo.getPaisesDeEscape(jugadorNombre);
	}
	
	// ********* Setters **********
	
	// ********* Metodos de instancia **********
	
	protected static void parseDocumento(String nombreDocumento)
	{
		//org.jdom2.Document document = null;
	     SAXBuilder sxb = new SAXBuilder();
	     try
	     {
	        document = sxb.build(new File(nombreDocumento));
	     }
	     catch(Exception e){
	         e.printStackTrace();
	     }
	     racine = document.getRootElement();
	}
	
	static void archivarEn(String fichier)
	{
	   try
	   {
	      XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat());
	      sortie.output(document, new FileOutputStream(fichier));
	   }
	   catch (java.io.IOException e){}
	}
	
	protected static String sacarPistaAleatoria(ArrayList<String> listaDePistas)
	{
		String pista = new String();
		int numeroDePista = (int)(Math.random() * listaDePistas.size());
		pista = listaDePistas.get(numeroDePista);
		return pista;
	}
// TODO si le joueur existe deja �craser puis sauvegarder
	protected static void guardar(
			String jugadorNombre,
			int jugadorArrestosINT,
			String jugadorPistaActual, 
			int jugadorNumeroDeEdificiosVisitadosINT,
			boolean jugadorYaHeridoConCuchilloBOOL,
			boolean estaEnCiudadIncorrectaBOOL,
			String jugadorEdificioActual,
			String paisActual,
			int tiempoINT,
			String ordenDeArrestoApellido, 
			String ordenDeArrestoSexo,
			String ordenDeArrestoSenia,
			String ordenDeArrestoCabello, 
			String ordenDeArrestoVehiculo,
			String ordenDeArrestoHobby, 
			String ladronApellido,
			String objetoRobadoNombre, 
			ArrayList<String> paisesDeEscape) 
	{
		String jugadorArrestos = Integer.toString(jugadorArrestosINT);
		String jugadorNumeroDeEdificiosVisitados = Integer.toString(jugadorNumeroDeEdificiosVisitadosINT);
		String jugadorYaHeridoConCuchillo = new Boolean(jugadorYaHeridoConCuchilloBOOL).toString();
		String estaEnCiudadIncorrecta = new Boolean(estaEnCiudadIncorrectaBOOL).toString();
		String tiempo = Integer.toString(tiempoINT);
		
		Archivo.archivar(
				jugadorNombre,
				jugadorArrestos,
				jugadorPistaActual,
				jugadorNumeroDeEdificiosVisitados,
				jugadorYaHeridoConCuchillo,
				estaEnCiudadIncorrecta,
				jugadorEdificioActual,
				paisActual, 
				tiempo,
				ordenDeArrestoApellido, 
				ordenDeArrestoSexo,
				ordenDeArrestoSenia,
				ordenDeArrestoCabello, 
				ordenDeArrestoVehiculo,
				ordenDeArrestoHobby, 
				ladronApellido,
				objetoRobadoNombre, 
				paisesDeEscape);
	}
	
	protected static void borrarPartidaDe(String nombreJugador)
	{
		Archivo.borrarPartida(nombreJugador);
	}
	
	protected static ArrayList<String> getListaJugadores()
	{
		return Archivo.getListaNombresJugadores();
	}
	
}
